package kahuuFotos.mundo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import javax.swing.ImageIcon;

import kahuuFotos.DTO.Foto;
import kahuuFotos.DTO.ListaFotos;

/**
 * 
 * @author gustavolozano
 *
 */
public class ManejadorFotos 
{
	
	public static final String URL_IMAGENES = "http://50.56.241.227:8080/imagenes/kahuuFotos/";
	
	public static final String GUARDAR = "./webapps";
	
	private int numero;
	
	
	//------------------------------------------------------------------------------------
	// Atributos
	//------------------------------------------------------------------------------------
	
	/*
	 * 
	 */
	private ArrayList<Foto> fotos;
	
	/*
	 * 
	 */
	private static ManejadorFotos instancia = null;
	
	//------------------------------------------------------------------------------------
	// Contructor
	//------------------------------------------------------------------------------------
	
	/**
	 * 
	 */
	public ManejadorFotos()
	{
		fotos = new ArrayList<Foto>();	
		numero = 0;
		//recuperarFotos();
	}
	
	public int darNumero()
	{
		numero++;
		return numero;
	}
	
	//------------------------------------------------------------------------------------
	// Instancia
	//-----------------------------------------------------------------------------------
	
	public static ManejadorFotos getInstance()
	{
		if(instancia == null)
		{
			instancia = new ManejadorFotos();
		}
		
		return instancia;
	}
	
	//------------------------------------------------------------------------------------
	// Metodos Seriabilidad
	//------------------------------------------------------------------------------------
	
	/**
	 * 
	 * @throws KahuuException
	 */
	public void guardarFotos() throws KahuuException
	{
		try
		{	
			FileOutputStream fileOut=new FileOutputStream("data/salvado.obj");
			ObjectOutputStream salida=new ObjectOutputStream(fileOut);

			salida.writeObject(fotos);

			salida.flush();
			salida.close();
			fileOut.close();
		}
		catch (Exception e) 
		{
			throw new KahuuException("Error:"+ e.getMessage());
		}
	}
	
	/**
	 * 
	 * @throws KahuuException
	 */
	@SuppressWarnings("unchecked")
	public void recuperarFotos() throws KahuuException
	{
		try
		{
			FileInputStream fileIn = new FileInputStream("data/salvado.obj");
			ObjectInputStream entrada=new ObjectInputStream(fileIn);

			fotos = (ArrayList<Foto>) entrada.readObject();
	
			entrada.close();
			fileIn.close();

		}
		catch (Exception e) 
		{
			throw new KahuuException("Error:"+ e.getMessage());
		}
	}
	
	//------------------------------------------------------------------------------------
	// Metodos
	//------------------------------------------------------------------------------------
	
	/**
	 * 
	 * @param nombre
	 * @param comentarios
	 * @param posicion
	 * @param file
	 */
	public void agregarFoto(String nombre,String comentarios, String posicion, File file)
	{	
		Foto foto = new Foto();
		foto.setNombre(nombre);
		foto.setComentarios(comentarios);
		foto.setRutaImagen(URL_IMAGENES+file.getName());
		foto.setLugar(posicion);
		
		fotos.add(foto);
	}
	
	/**
	 * 
	 * @param foto
	 * @return
	 */
	public ListaFotos darFotoMasSimilar(int ancho)
	{
		ArrayList<Foto> lista = new ArrayList<Foto>();
		
		for (int i = 0; i < fotos.size(); i++) 
		{
			Foto f = fotos.get(i);			
			try 
			{
				ImageIcon a2 = new ImageIcon(new URL(f.getRutaImagen()));
				
				if(a2.getIconWidth() == ancho)
				{
					lista.add(f);
				}
			} 
			catch (MalformedURLException e) 
			{
				return new ListaFotos();
			}
		}
		
		ListaFotos listaF = new ListaFotos();
		listaF.setFotos(lista);
		
		return listaF;
	}
	
	/**
	 * 
	 * @param posicion
	 * @return
	 */
	public  ListaFotos darFotosCerca(String posicion)
	{	
		ArrayList<Foto> lista = new ArrayList<Foto>();
		
		for (Foto f : fotos) 
		{
			if(f.getLugar().equalsIgnoreCase(posicion))
			{
				lista.add(f);
			}
		}
		
		ListaFotos listaF = new ListaFotos();
		listaF.setFotos(lista);
		
		return listaF;
	}
}	
